 

//! 插件协议 (Trait)

//! 

//! 定义了所有插件与微内核交互的标准接口。



use std::any::Any;
use std::sync::Arc;
use async_trait::async_trait;

use super::manifest::ContributionKeywordDefinition;

use super::services::context::ActivateContext;



/// 所有插件逻辑都必须实现的 Trait。

/// `Send + Sync` 约束是必要的，因为插件可能在多线程环境中被调用。

/// 这对应 `ai-server` 的 `manifests/types.py` 中的 `ExpansionImplement` 协议。

#[async_trait]

pub trait RigPlugin: Send + Sync {

    /// 在扩展激活之前调用，用于动态补充贡献点和贡献。

        fn before_activate(&mut self, _ctx: &ActivateContext) {}

    

        /// 插件的激活逻辑。

        /// 内核在调用此方法时，会传入一个已经根据依赖注入填充好的 `ActivateContext`。

        /// 返回值是插件向外暴露的 API。

        async fn activate(&mut self, ctx: &ActivateContext) -> Option<Arc<dyn Any + Send + Sync>>;

    

        /// 在同一激活事件的所有扩展都激活完成后执行。

        fn post_activated(&mut self, _ctx: &ActivateContext) {}

    

        /// 插件的停用逻辑，用于清理资源。

        async fn deactivate(&mut self, _ctx: &ActivateContext);

    



    /// 当插件定义了 `contribution_keywords` 时，内核会调用此方法来获取关键字的具体实现。

    fn get_contribution_keyword(

        &self,

        _keyword: &ContributionKeywordDefinition,

        _ctx: &ActivateContext,

    ) -> Option<Box<dyn Any + Send + Sync>> {

        None

    }



    /// 如果插件提供服务上下文，内核将调用此方法来获取它。

        fn get_context(&self) -> Option<Arc<dyn Any + Send + Sync>> {

            None

        }

    

}

